1. /* sdfdcoss.cpp by K.Tsuru */
  2. // function ID 3209 DRADIX
  3. /***********************************************************
  4. cos(x) by series for |x| < pi/4
  5. if first != 0 calculate the value cos(x) , else cos(x) - 1.
  6. ************************************************************/
  7. #ifndef SN_H
  8. #include "sn.h"
  9. #endif
  10. static const char* func = "CosSeries";
  11. SDouble CosSeries(const SDouble& x, int first){
  12. SDouble sum, xsq, delta;
  13. ulong n = 3, den, mt = x.SlOpMaxValue();
  14. if(x.NetRdxExp() > 1) sum.SetError(sum.DOMAIN_ERR, func, 3209);
  15. xsq = x*x;
  16. delta = DsDiv(xsq, 2);
  17. if(first){
  18. sum = 1.0; sum.FixedPoint(0);
  19. sum -= delta;
  20. } else {
  21. sum = -delta;
  22. sum.FixedPoint(sum.RdxExp());
  23. }
  24. while(delta.Sign(3209)){// n(n+1) < x.SlOpMaxValue()
  25. den = n*(n+1);
  26. if(den >= mt) break;
  27. delta *= xsq;
  28. delta = DsDiv(delta, den);
  29. if(n & 2) sum += delta;
  30. else sum -= delta;
  31. n += 2;
  32. }
  33. while(delta.Sign(3209)){// n(n+1) >= x.SlOpMaxValue()
  34. if(n >= mt){
  35. sum.SetError(sum.NOT_CONVERGE, func, -3209);
  36. break;
  37. }
  38. delta *= xsq;
  39. delta = DsDiv(delta, n );
  40. delta = DsDiv(delta, n+1);
  41. if(n & 2) sum += delta;
  42. else sum -= delta;
  43. n += 2;
  44. }
  45. sum.PointFree();
  46. sum.Reform(3209);
  47. sum.upToTerm = n/2;
  48. return sum;
  49. }

sdfdcoss.cpp : last modifiled at 2017/09/07 15:09:42(1,297 bytes)
created at 2017/10/07 10:22:50
The creation time of this html file is 2017/10/07 11:29:39 (Sat Oct 07 11:29:39 2017).